package logica;

import java.util.ArrayList;
import java.util.List;

import logica.pessoa.Filial;
import logica.util.Data;
import logica.veiculo.Acessorio;
import logica.veiculo.Combustivel;
import logica.veiculo.Cor;
import logica.veiculo.Estado;
import logica.veiculo.Potencia;
import logica.Veiculo;
import logica.veiculo.Automovel;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;


public class TestaVeiculo {
	private Automovel novoVeiculo;
	private List<Acessorio> acessorios;
	private List<Acessorio> acessorios2;

	@Before public void criaVeiculo() throws Exception {
		acessorios = new ArrayList<Acessorio>();
		acessorios2 = new ArrayList<Acessorio>();
		acessorios.add(Acessorio.P2);
		novoVeiculo = new Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
	}
	
	@Test public void testaConstrutor() {
		try {
			novoVeiculo = new Automovel(null, "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de RENAVAM invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de RENAVAM nulo", "RENAVAM invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new Automovel("", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de RENAVAM vazio", "RENAVAM invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new Automovel("12a45", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de RENAVAM invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de RENAVAM invalido", "RENAVAM invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new Automovel("12345", null, "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de modelo invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de Modelo nulo", "Modelo invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new Automovel("12345", "", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de modelo invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de Modelo vazio", "Modelo invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new Automovel("12345",  "modelo teste", null, 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de marca invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de Marca nula", "Marca invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new Automovel("12345",  "modelo teste", "", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de modelo invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de Marca vazia", "Marca invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345",  "modelo teste", "marca teste", -1000, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de ano de fabricacao invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de ano de fabricacao negativo", "Ano de fabricacao invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345",  "modelo teste", "marca teste", 2005, -50, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de potencia invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de potencia negativa", "Potencia invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345",  "modelo teste", "marca teste", 2005, 0, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de potencia invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de potencia igual a 0", "Potencia invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, null, Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de Data invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de Data nula", "Data invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, null, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de tipo de potencia invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de tipo de potencia nula", "Tipo de potencia invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, null, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de tipo de potencia invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de tipo de potencia nula", "Tipo de potencia invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, null, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de cor invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de cor nula", "Cor invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, null, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de tipo de combustivel invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de tipo de combustivel nulo", "Tipo de combustivel invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), null, acessorios, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de filial invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de tipo de filial nula", "Filial invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, null, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de lista acessorios invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de lista de acessorios nula", "Lista de acessorios invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios2, Estado.DISPONIVEL, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de lista acessorios invalida.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de lista de acessorios vazia", "Lista de acessorios invalida.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, null, "MOH3719", 50);
			Assert.fail("Deveria ter apresentado erro de estado invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro de estado nulo", "Estado invalido.", e.getMessage());
		}
		
		try {
			novoVeiculo = new  Automovel("12345", "modelo teste", "marca teste", 2005, 2500, Potencia.CV, Cor.AZUL, Combustivel.FLEX, new Data(), Filial.CENTRO, acessorios, Estado.DISPONIVEL, "MOH3719", -50);
			Assert.fail("Deveria ter apresentado erro de nivel do tanque invalido.");
		} catch (Exception e) {
			Assert.assertEquals("Deveria ter apresentado erro do nivel de tanque negativo", "Nivel do tanque invalido.", e.getMessage());
		}
	}
 	

}
